import config from '@/common/config';

/**
 * 获取路径转换成驼峰式命名方式
 * @param path  路径
 * @returns     驼峰式命名
 */
function toHump(path: string) {
    return path.toLowerCase().replace(/\/(\w)/g, (all, letter) => letter.toUpperCase());
}

/**
 * 自动扫描注册API接口
 * @returns API模块
 */
function scanApi() {
    const modules: any = {};
    // 自动化扫描API文件
    const files: any = import.meta.globEager('../api/**/**.ts');
    for (const key in files) {
        // 获取驼峰式命名方式
        const name: string = toHump(key.replace(/(..\/api|\.ts)/g, ''));
        modules[name] = files[key].default;
    }

    // 返回API
    return modules;
}

const install = (Vue: any) => {
    // 获取vue全局属性
    const vm = Vue.config.globalProperties;

    // 设置全局默认配置
    vm.$u.http.setConfig({
        url: config.domain,
    });

    // 请求拦截，配置Token等参数
    vm.$u.http.interceptor.request = (config: any) => {
        config.header.Token = '123';
        return config;
    };

    // 响应拦截，判断状态码是否通过
    vm.$u.http.interceptor.response = (response: any) => {
        // ====================================
        // 处理正常请求
        // ====================================
        if (response.statusCode == 200) {
            const { code, msg, data } = response.data;

            // 打印请求数据
            console.log('打印请求 ->');
            console.log(data);

            // 处理正常业务请求,返回data数据
            if (code == 20000) {
                return data;
            }

            // ====================================
            // 处理异常业务请求
            // ====================================
            // 50009: 账号未登录,请重新登录
            // 50014: 账号登录失效,请重新登录
            // 50015: 账号已被顶下线
            // ====================================

            // 业务异常提示
            if (code === 50002) {
                // 提示操作
                vm.$u.alert.info(msg);
            }

            if (code === 50009 || code === 50014) {
                console.log('响应拦截 -> 账号未登录或登录失效,要求重新登录');
                vm.$u.alert.info('申请获得你的公开信息(昵称、头像等)', true).then(() => {
                    vm.$u.route({
                        type: 'reLaunch',
                        url: 'pages/public/login',
                    });
                });
            }
            if (code === 50015) {
                // 账号已被顶下线,请重新登录
                console.log('响应拦截 -> 账号下线,要求重新登录');
                vm.$u.alert.info('账号已被顶下线,请重新登录', true).then(() => {
                    vm.$u.route({
                        type: 'reLaunch',
                        url: 'pages/public/login',
                    });
                });
            }
            vm.$u.toast(msg || 'Error');
            // 进入catch回调
            return false;
        } else {
            console.log('异常请求 ->');
            console.log(response);
            // 处理异常请求
            const { statusCode } = response;
            let msg: string;

            switch (statusCode) {
                case 404:
                    msg = '找不到请求';
                    break;
                case 408:
                    msg = '网络请求超时';
                    break;
                case 500:
                    msg = '网络请求异常';
                    break;
                default:
                    msg = '网络请求失败';
            }
            console.log(msg);
            vm.$u.toast(msg || 'Error');
            return false;
        }
    };

    // 自动扫描API文件
    vm.$u.api = scanApi();

    // 开发模式打印日志
    console.log('-------------------------------');
    console.log('>>> 自动扫描 -> API');
    console.log('-------------------------------');
    console.log(vm.$u.api);
    console.log('-------------------------------');
};

export default {
    install,
};
